/*
 * FreeRTOS Kernel V10.1.1
 * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#ifndef MPU_WRAPPERS_H
#define MPU_WRAPPERS_H

/* This file redefines API functions to be called through a wrapper macro, but
only for ports that are using the MPU. */
#ifdef portUSING_MPU_WRAPPERS

    /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
    included from queue.c or task.c to prevent it from having an effect within
    those files. */
    #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

        /*
         * Map standard (non MPU) API functions to equivalents that start
         * "MPU_".  This will cause the application code to call the MPU_
         * version, which wraps the non-MPU version with privilege promoting
         * then demoting code, so the kernel code always runs will full
         * privileges.
         */

        /* Map standard tasks.h API functions to the MPU equivalents. */
        #define xTaskCreate                             MPU_xTaskCreate
        #define xTaskCreateStatic                       MPU_xTaskCreateStatic
        #define xTaskCreateRestricted                   MPU_xTaskCreateRestricted
        #define vTaskAllocateMPURegions                 MPU_vTaskAllocateMPURegions
        #define vTaskDelete                             MPU_vTaskDelete
        #define vTaskDelay                              MPU_vTaskDelay
        #define vTaskDelayUntil                         MPU_vTaskDelayUntil
        #define xTaskAbortDelay                         MPU_xTaskAbortDelay
        #define uxTaskPriorityGet                       MPU_uxTaskPriorityGet
        #define eTaskGetState                           MPU_eTaskGetState
        #define vTaskGetInfo                            MPU_vTaskGetInfo
        #define vTaskPrioritySet                        MPU_vTaskPrioritySet
        #define vTaskSuspend                            MPU_vTaskSuspend
        #define vTaskResume                             MPU_vTaskResume
        #define vTaskSuspendAll                         MPU_vTaskSuspendAll
        #define xTaskResumeAll                          MPU_xTaskResumeAll
        #define xTaskGetTickCount                       MPU_xTaskGetTickCount
        #define uxTaskGetNumberOfTasks                  MPU_uxTaskGetNumberOfTasks
        #define pcTaskGetName                           MPU_pcTaskGetName
        #define xTaskGetHandle                          MPU_xTaskGetHandle
        #define uxTaskGetStackHighWaterMark             MPU_uxTaskGetStackHighWaterMark
        #define vTaskSetApplicationTaskTag              MPU_vTaskSetApplicationTaskTag
        #define xTaskGetApplicationTaskTag              MPU_xTaskGetApplicationTaskTag
        #define vTaskSetThreadLocalStoragePointer       MPU_vTaskSetThreadLocalStoragePointer
        #define pvTaskGetThreadLocalStoragePointer      MPU_pvTaskGetThreadLocalStoragePointer
        #define xTaskCallApplicationTaskHook            MPU_xTaskCallApplicationTaskHook
        #define xTaskGetIdleTaskHandle                  MPU_xTaskGetIdleTaskHandle
        #define uxTaskGetSystemState                    MPU_uxTaskGetSystemState
        #define vTaskList                               MPU_vTaskList
        #define vTaskGetRunTimeStats                    MPU_vTaskGetRunTimeStats
        #define xTaskGenericNotify                      MPU_xTaskGenericNotify
        #define xTaskNotifyWait                         MPU_xTaskNotifyWait
        #define ulTaskNotifyTake                        MPU_ulTaskNotifyTake
        #define xTaskNotifyStateClear                   MPU_xTaskNotifyStateClear

        #define xTaskGetCurrentTaskHandle               MPU_xTaskGetCurrentTaskHandle
        #define vTaskSetTimeOutState                    MPU_vTaskSetTimeOutState
        #define xTaskCheckForTimeOut                    MPU_xTaskCheckForTimeOut
        #define xTaskGetSchedulerState                  MPU_xTaskGetSchedulerState

        /* Map standard queue.h API functions to the MPU equivalents. */
        #define xQueueGenericSend                       MPU_xQueueGenericSend
        #define xQueueReceive                           MPU_xQueueReceive
        #define xQueuePeek                              MPU_xQueuePeek
        #define xQueueSemaphoreTake                     MPU_xQueueSemaphoreTake
        #define uxQueueMessagesWaiting                  MPU_uxQueueMessagesWaiting
        #define uxQueueSpacesAvailable                  MPU_uxQueueSpacesAvailable
        #define vQueueDelete                            MPU_vQueueDelete
        #define xQueueCreateMutex                       MPU_xQueueCreateMutex
        #define xQueueCreateMutexStatic                 MPU_xQueueCreateMutexStatic
        #define xQueueCreateCountingSemaphore           MPU_xQueueCreateCountingSemaphore
        #define xQueueCreateCountingSemaphoreStatic     MPU_xQueueCreateCountingSemaphoreStatic
        #define xQueueGetMutexHolder                    MPU_xQueueGetMutexHolder
        #define xQueueTakeMutexRecursive                MPU_xQueueTakeMutexRecursive
        #define xQueueGiveMutexRecursive                MPU_xQueueGiveMutexRecursive
        #define xQueueGenericCreate                     MPU_xQueueGenericCreate
        #define xQueueGenericCreateStatic               MPU_xQueueGenericCreateStatic
        #define xQueueCreateSet                         MPU_xQueueCreateSet
        #define xQueueAddToSet                          MPU_xQueueAddToSet
        #define xQueueRemoveFromSet                     MPU_xQueueRemoveFromSet
        #define xQueueSelectFromSet                     MPU_xQueueSelectFromSet
        #define xQueueGenericReset                      MPU_xQueueGenericReset

        #if( configQUEUE_REGISTRY_SIZE > 0 )
            #define vQueueAddToRegistry                 MPU_vQueueAddToRegistry
            #define vQueueUnregisterQueue               MPU_vQueueUnregisterQueue
            #define pcQueueGetName                      MPU_pcQueueGetName
        #endif

        /* Map standard timer.h API functions to the MPU equivalents. */
        #define xTimerCreate                            MPU_xTimerCreate
        #define xTimerCreateStatic                      MPU_xTimerCreateStatic
        #define pvTimerGetTimerID                       MPU_pvTimerGetTimerID
        #define vTimerSetTimerID                        MPU_vTimerSetTimerID
        #define xTimerIsTimerActive                     MPU_xTimerIsTimerActive
        #define xTimerGetTimerDaemonTaskHandle          MPU_xTimerGetTimerDaemonTaskHandle
        #define xTimerPendFunctionCall                  MPU_xTimerPendFunctionCall
        #define pcTimerGetName                          MPU_pcTimerGetName
        #define xTimerGetPeriod                         MPU_xTimerGetPeriod
        #define xTimerGetExpiryTime                     MPU_xTimerGetExpiryTime
        #define xTimerGenericCommand                    MPU_xTimerGenericCommand

        /* Map standard event_group.h API functions to the MPU equivalents. */
        #define xEventGroupCreate                       MPU_xEventGroupCreate
        #define xEventGroupCreateStatic                 MPU_xEventGroupCreateStatic
        #define xEventGroupWaitBits                     MPU_xEventGroupWaitBits
        #define xEventGroupClearBits                    MPU_xEventGroupClearBits
        #define xEventGroupSetBits                      MPU_xEventGroupSetBits
        #define xEventGroupSync                         MPU_xEventGroupSync
        #define vEventGroupDelete                       MPU_vEventGroupDelete

        /* Map standard message/stream_buffer.h API functions to the MPU
        equivalents. */
        #define xStreamBufferSend                       MPU_xStreamBufferSend
        #define xStreamBufferSendFromISR                MPU_xStreamBufferSendFromISR
        #define xStreamBufferReceive                    MPU_xStreamBufferReceive
        #define xStreamBufferNextMessageLengthBytes     MPU_xStreamBufferNextMessageLengthBytes
        #define xStreamBufferReceiveFromISR             MPU_xStreamBufferReceiveFromISR
        #define vStreamBufferDelete                     MPU_vStreamBufferDelete
        #define xStreamBufferIsFull                     MPU_xStreamBufferIsFull
        #define xStreamBufferIsEmpty                    MPU_xStreamBufferIsEmpty
        #define xStreamBufferReset                      MPU_xStreamBufferReset
        #define xStreamBufferSpacesAvailable            MPU_xStreamBufferSpacesAvailable
        #define xStreamBufferBytesAvailable             MPU_xStreamBufferBytesAvailable
        #define xStreamBufferSetTriggerLevel            MPU_xStreamBufferSetTriggerLevel
        #define xStreamBufferGenericCreate              MPU_xStreamBufferGenericCreate
        #define xStreamBufferGenericCreateStatic        MPU_xStreamBufferGenericCreateStatic


        /* Remove the privileged function macro, but keep the PRIVILEGED_DATA
        macro so applications can place data in privileged access sections
        (useful when using statically allocated objects). */
        #define PRIVILEGED_FUNCTION
        #define PRIVILEGED_DATA __attribute__((section("privileged_data")))

    #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

        /* Ensure API functions go in the privileged execution section. */
        #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions")))
        #define PRIVILEGED_DATA __attribute__((section("privileged_data")))

    #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

#else /* portUSING_MPU_WRAPPERS */

	#define PRIVILEGED_FUNCTION
	#define PRIVILEGED_DATA
	#define portUSING_MPU_WRAPPERS 0

#endif /* portUSING_MPU_WRAPPERS */


#endif /* MPU_WRAPPERS_H */

